home *** CD-ROM | disk | FTP | other *** search
/ AGA Toolkit '97 / The AGA Toolkit '97.iso / miscellaneous / science / maths / calc / source / qmath.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-07  |  9.4 KB  |  228 lines

  1. /*
  2.  * Copyright (c) 1994 David I. Bell
  3.  * Permission is granted to use, distribute, or modify this source,
  4.  * provided that this copyright notice remains intact.
  5.  *
  6.  * Data structure declarations for extended precision rational arithmetic.
  7.  */
  8.  
  9. #ifndef    QMATH_H
  10. #define    QMATH_H
  11.  
  12. #include "zmath.h"
  13.  
  14.  
  15. /*
  16.  * Rational arithmetic definitions.
  17.  */
  18. typedef struct {
  19.     ZVALUE num;        /* numerator (containing sign) */
  20.     ZVALUE den;        /* denominator (always positive) */
  21.     long links;        /* number of links to this value */
  22. } NUMBER;
  23.  
  24.  
  25. /*
  26.  * Input. output, allocation, and conversion routines.
  27.  */
  28. extern NUMBER *qalloc MATH_PROTO((void));
  29. extern NUMBER *qcopy MATH_PROTO((NUMBER *q));
  30. extern NUMBER *iitoq MATH_PROTO((long i1, long i2));
  31. extern NUMBER *atoq MATH_PROTO((char *str));
  32. extern NUMBER *itoq MATH_PROTO((long i));
  33. extern NUMBER *utoq MATH_PROTO((FULL i));
  34. extern long qtoi MATH_PROTO((NUMBER *q));
  35. extern FULL qtou MATH_PROTO((NUMBER *q));
  36. extern long qparse MATH_PROTO((char *str, int flags));
  37. extern void qfreenum MATH_PROTO((NUMBER *q));
  38. extern void qprintnum MATH_PROTO((NUMBER *q, int mode));
  39. extern void qprintff MATH_PROTO((NUMBER *q, long width, long precision));
  40. extern void qprintfe MATH_PROTO((NUMBER *q, long width, long precision));
  41. extern void qprintfr MATH_PROTO((NUMBER *q, long width, BOOL force));
  42. extern void qprintfd MATH_PROTO((NUMBER *q, long width));
  43. extern void qprintfx MATH_PROTO((NUMBER *q, long width));
  44. extern void qprintfb MATH_PROTO((NUMBER *q, long width));
  45. extern void qprintfo MATH_PROTO((NUMBER *q, long width));
  46. extern int tilde_ok;
  47. extern int tab_ok;
  48.  
  49.  
  50.  
  51. /*
  52.  * Basic numeric routines.
  53.  */
  54. extern NUMBER *qaddi MATH_PROTO((NUMBER *q, long i));
  55. extern NUMBER *qmuli MATH_PROTO((NUMBER *q, long i));
  56. extern NUMBER *qdivi MATH_PROTO((NUMBER *q, long i));
  57. extern NUMBER *qadd MATH_PROTO((NUMBER *q1, NUMBER *q2));
  58. extern NUMBER *qsub MATH_PROTO((NUMBER *q1, NUMBER *q2));
  59. extern NUMBER *qmul MATH_PROTO((NUMBER *q1, NUMBER *q2));
  60. extern NUMBER *qdiv MATH_PROTO((NUMBER *q1, NUMBER *q2));
  61. extern NUMBER *qquo MATH_PROTO((NUMBER *q1, NUMBER *q2));
  62. extern NUMBER *qmod MATH_PROTO((NUMBER *q1, NUMBER *q2));
  63. extern NUMBER *qmin MATH_PROTO((NUMBER *q1, NUMBER *q2));
  64. extern NUMBER *qmax MATH_PROTO((NUMBER *q1, NUMBER *q2));
  65. extern NUMBER *qand MATH_PROTO((NUMBER *q1, NUMBER *q2));
  66. extern NUMBER *qor MATH_PROTO((NUMBER *q1, NUMBER *q2));
  67. extern NUMBER *qxor MATH_PROTO((NUMBER *q1, NUMBER *q2));
  68. extern NUMBER *qpowermod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  69. extern NUMBER *qpowi MATH_PROTO((NUMBER *q1, NUMBER *q2));
  70. extern NUMBER *qsquare MATH_PROTO((NUMBER *q));
  71. extern NUMBER *qneg MATH_PROTO((NUMBER *q));
  72. extern NUMBER *qsign MATH_PROTO((NUMBER *q));
  73. extern NUMBER *qint MATH_PROTO((NUMBER *q));
  74. extern NUMBER *qfrac MATH_PROTO((NUMBER *q));
  75. extern NUMBER *qnum MATH_PROTO((NUMBER *q));
  76. extern NUMBER *qden MATH_PROTO((NUMBER *q));
  77. extern NUMBER *qinv MATH_PROTO((NUMBER *q));
  78. extern NUMBER *qabs MATH_PROTO((NUMBER *q));
  79. extern NUMBER *qinc MATH_PROTO((NUMBER *q));
  80. extern NUMBER *qdec MATH_PROTO((NUMBER *q));
  81. extern NUMBER *qshift MATH_PROTO((NUMBER *q, long n));
  82. extern NUMBER *qtrunc MATH_PROTO((NUMBER *q1, NUMBER *q2));
  83. extern NUMBER *qround MATH_PROTO((NUMBER *q, long places));
  84. extern NUMBER *qbtrunc MATH_PROTO((NUMBER *q1, NUMBER *q2));
  85. extern NUMBER *qbround MATH_PROTO((NUMBER *q, long places));
  86. extern NUMBER *qscale MATH_PROTO((NUMBER *q, long i));
  87. extern BOOL qdivides MATH_PROTO((NUMBER *q1, NUMBER *q2));
  88. extern BOOL qcmp MATH_PROTO((NUMBER *q1, NUMBER *q2));
  89. extern BOOL qcmpi MATH_PROTO((NUMBER *q, long i));
  90. extern FLAG qrel MATH_PROTO((NUMBER *q1, NUMBER *q2));
  91. extern FLAG qreli MATH_PROTO((NUMBER *q, long i));
  92. extern BOOL qisset MATH_PROTO((NUMBER *q, long i));
  93.  
  94.  
  95. /*
  96.  * More complicated numeric functions.
  97.  */
  98. extern NUMBER *qcomb MATH_PROTO((NUMBER *q1, NUMBER *q2));
  99. extern NUMBER *qgcd MATH_PROTO((NUMBER *q1, NUMBER *q2));
  100. extern NUMBER *qlcm MATH_PROTO((NUMBER *q1, NUMBER *q2));
  101. extern NUMBER *qfact MATH_PROTO((NUMBER *q));
  102. extern NUMBER *qpfact MATH_PROTO((NUMBER *q));
  103. extern NUMBER *qminv MATH_PROTO((NUMBER *q1, NUMBER *q2));
  104. extern NUMBER *qfacrem MATH_PROTO((NUMBER *q1, NUMBER *q2));
  105. extern NUMBER *qperm MATH_PROTO((NUMBER *q1, NUMBER *q2));
  106. extern NUMBER *qgcdrem MATH_PROTO((NUMBER *q1, NUMBER *q2));
  107. extern NUMBER *qlowfactor MATH_PROTO((NUMBER *q1, NUMBER *q2));
  108. extern NUMBER *qfib MATH_PROTO((NUMBER *q));
  109. extern NUMBER *qcfappr MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  110. extern NUMBER *qisqrt MATH_PROTO((NUMBER *q));
  111. extern NUMBER *qjacobi MATH_PROTO((NUMBER *q1, NUMBER *q2));
  112. extern NUMBER *qiroot MATH_PROTO((NUMBER *q1, NUMBER *q2));
  113. extern NUMBER *qbappr MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  114. extern NUMBER *qlcmfact MATH_PROTO((NUMBER *q));
  115. extern NUMBER *qminmod MATH_PROTO((NUMBER *q1, NUMBER *q2));
  116. extern NUMBER *qredcin MATH_PROTO((NUMBER *q1, NUMBER *q2));
  117. extern NUMBER *qredcout MATH_PROTO((NUMBER *q1, NUMBER *q2));
  118. extern NUMBER *qredcmul MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  119. extern NUMBER *qredcsquare MATH_PROTO((NUMBER *q1, NUMBER *q2));
  120. extern NUMBER *qredcpower MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  121. extern BOOL qprimetest MATH_PROTO((NUMBER *q1, NUMBER *q2));
  122. extern BOOL qissquare MATH_PROTO((NUMBER *q));
  123. extern long qilog2 MATH_PROTO((NUMBER *q));
  124. extern long qilog10 MATH_PROTO((NUMBER *q));
  125. extern BOOL qcmpmod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  126. extern BOOL qquomod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER **retdiv,
  127.     NUMBER **retmod));
  128. extern FLAG qnear MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  129. extern FLAG qdigit MATH_PROTO((NUMBER *q, long i));
  130. extern long qprecision MATH_PROTO((NUMBER *q));
  131. extern long qplaces MATH_PROTO((NUMBER *q));
  132. extern long qdigits MATH_PROTO((NUMBER *q));
  133. extern HASH qhash MATH_PROTO((NUMBER *q));
  134. extern void setepsilon MATH_PROTO((NUMBER *q));
  135.  
  136. #if 0
  137. extern NUMBER *qbitvalue MATH_PROTO((long i));
  138. extern NUMBER *qmulmod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  139. extern NUMBER *qsquaremod MATH_PROTO((NUMBER *q1, NUMBER *q2));
  140. extern NUMBER *qaddmod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  141. extern NUMBER *qsubmod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  142. extern NUMBER *qreadval MATH_PROTO((FILE *fp));
  143. extern NUMBER *qnegmod MATH_PROTO((NUMBER *q1, NUMBER *q2));
  144. extern BOOL qbittest MATH_PROTO((NUMBER *q, long i));
  145. extern FLAG qtest MATH_PROTO((NUMBER *q));
  146. #endif
  147.  
  148.  
  149. /*
  150.  * Transcendental functions.  These all take an epsilon argument to
  151.  * specify the required accuracy of the calculation.
  152.  */
  153. extern NUMBER *qsqrt MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  154. extern NUMBER *qpower MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  155. extern NUMBER *qroot MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  156. extern NUMBER *qcos MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  157. extern NUMBER *qsin MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  158. extern NUMBER *qexp MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  159. extern NUMBER *qln MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  160. extern NUMBER *qtan MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  161. extern NUMBER *qacos MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  162. extern NUMBER *qasin MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  163. extern NUMBER *qatan MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  164. extern NUMBER *qatan2 MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  165. extern NUMBER *qhypot MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  166. extern NUMBER *qcosh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  167. extern NUMBER *qsinh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  168. extern NUMBER *qtanh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  169. extern NUMBER *qacosh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  170. extern NUMBER *qasinh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  171. extern NUMBER *qatanh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  172. extern NUMBER *qlegtoleg MATH_PROTO((NUMBER *q, NUMBER *epsilon, BOOL wantneg));
  173. extern NUMBER *qpi MATH_PROTO((NUMBER *epsilon));
  174.  
  175.  
  176. /*
  177.  * macro expansions to speed this thing up
  178.  */
  179. #define qiszero(q)    (ziszero((q)->num))
  180. #define qisneg(q)    (zisneg((q)->num))
  181. #define qispos(q)    (zispos((q)->num))
  182. #define qisint(q)    (zisunit((q)->den))
  183. #define qisfrac(q)    (!zisunit((q)->den))
  184. #define qisunit(q)    (zisunit((q)->num) && zisunit((q)->den))
  185. #define qisone(q)    (zisone((q)->num) && zisunit((q)->den))
  186. #define qisnegone(q)    (zisnegone((q)->num) && zisunit((q)->den))
  187. #define qistwo(q)    (zistwo((q)->num) && zisunit((q)->den))
  188. #define qiseven(q)    (zisunit((q)->den) && ziseven((q)->num))
  189. #define qisodd(q)    (zisunit((q)->den) && zisodd((q)->num))
  190. #define qistwopower(q)    (zisunit((q)->den) && zistwopower((q)->num))
  191.  
  192. #define qhighbit(q)    (zhighbit((q)->num))
  193. #define qlowbit(q)    (zlowbit((q)->num))
  194. #define qdivcount(q1, q2)    (zdivcount((q1)->num, (q2)->num))
  195. #define qilog(q1, q2)    (zlog((q1)->num, (q2)->num))
  196. #define qlink(q)    ((q)->links++, (q))
  197.  
  198. #define qfree(q)    {if (--((q)->links) <= 0) qfreenum(q);}
  199.  
  200.  
  201. /*
  202.  * Flags for qparse calls
  203.  */
  204. #define QPF_SLASH    0x1    /* allow slash for fractional number */
  205. #define QPF_IMAG    0x2    /* allow trailing 'i' for imaginary number */
  206.  
  207.  
  208. #ifdef VARARGS
  209. extern void qprintf();
  210. #else
  211. extern void qprintf MATH_PROTO((char *, ...));
  212. #endif
  213.  
  214.  
  215. /*
  216.  * constants used often by the arithmetic routines
  217.  */
  218. extern NUMBER _qzero_, _qone_, _qnegone_, _qonehalf_;
  219. extern BOOL _sinisneg_;        /* whether sin(x) < 0 (set by cos(x)) */
  220. extern long _epsilonprec_;    /* binary precision of epsilon */
  221. extern NUMBER *_epsilon_;    /* default error for real functions */
  222. extern long _outdigits_;    /* current output digits for float or exp */
  223. extern int _outmode_;        /* current output mode */
  224.  
  225. #endif
  226.  
  227. /* END CODE */
  228.